package com.link2room.blaster.websocket;

import com.link2room.blaster.facade.InMailFacadeService;
import com.link2room.common.util.SpringUtil;
import com.link2room.blaster.dto.param.inMail.InMailConnectParamDto;
import org.springframework.stereotype.Component;

import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;

/**
 * Created by LN on 2017/6/14.12:30
 */
@ServerEndpoint(value = "/inMail/{ticket}")
@Component
public class InMailSocket {


    private InMailFacadeService inMailFacadeService;
    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
    private static int onlineCount = 0;



    /**
     * 连接建立成功调用的方法*/
    @OnOpen
    public void onOpen(Session session, @PathParam("ticket") String ticket) throws Exception {
        if(inMailFacadeService == null){
            inMailFacadeService = (InMailFacadeService) SpringUtil.getBean("inMailFacadeService");
        }
        addOnlineCount();           //在线数加1

        inMailFacadeService.login(new InMailConnectParamDto(ticket,session));
        System.out.println("有新连接加入！当前在线人数为" + getOnlineCount());
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session, @PathParam("ticket") String ticket) {
        if(inMailFacadeService == null){
            inMailFacadeService = (InMailFacadeService) SpringUtil.getBean("inMailFacadeService");
        }
        subOnlineCount();           //在线数减1
        inMailFacadeService.logout(new InMailConnectParamDto(ticket,session));
        System.out.println("有一连接关闭！当前在线人数为" + getOnlineCount());
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息*/
    @OnMessage
    public void onMessage(String message, Session session) {
        System.out.println("来自客户端的消息:" + message);
    }

    /**
     * 发生错误时调用
     @OnError
     */
     public void onError(Session session, Throwable error) {
     System.out.println("发生错误");
     error.printStackTrace();
     }


    public static synchronized int getOnlineCount() {
        return onlineCount;
    }

    public static synchronized void addOnlineCount() {
        InMailSocket.onlineCount++;
    }

    public static synchronized void subOnlineCount() {
        InMailSocket.onlineCount--;
    }
}
